import axios, {
  type AxiosResponse,
  type InternalAxiosRequestConfig,
} from "axios";
import { ElMessage, ElMessageBox } from "element-plus";
import { localStorage } from "./storage";
const instance = axios.create({
  //http://localhost:5174/sunny 简写为/sunny 表示从当前域名下往/sunny路径发送
  baseURL: "/sunny",
  timeout: 30000,
  headers: { "Content-Type": "application/json;charset=utf-8" },
});

/**
 * 为axios的请求添加拦截器，在每个请求发送的时候，添加token作为请求头
 */
instance.interceptors.request.use(
  //正常请求的回调函数
  function (config: InternalAxiosRequestConfig) {
    if (!config.headers) {
      throw new Error("config或者config.headers缺失，请检查前端代码");
    }
    //每个请求操作的时候，加上Authorization的请求头
    const token = localStorage.get("token");
    if (token) {
      config.headers.Authorization = token;
    }
    return config;
  },
  //异常回调
  function (error) {
    return Promise.reject(error);
  }
);

//注意是对axios实例添加拦截器。
//返回拦截器中，判断是否为未鉴权状态，如果未鉴权，跳转到登录界面。
instance.interceptors.response.use(
  function (response: AxiosResponse) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    const { code, msg } = response.data;
    //如果返回结果的code是1000，说明请求业务逻辑成功（这是自己写后端的时候定义的）
    if (code === 1000) {
      //如果返回结果包含登录，需要获取返回头，所以axios返回结果中返回完整的response
      if (msg.indexOf("登录") !== -1) {
        return response;
      }
      return response.data;
    }
    ElMessage({
      //||能够判断前面的语句为false再执行后面的，所以msg如果为null或者undefined，就会执行后面的
      message: "请求业务失败：" + msg || "系统错误",
      type: "error",
    });

    return Promise.reject(new Error(msg || "系统错误"));
  },
  function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    //如果没有携带token或者鉴权失败的情况下，需要跳转到登录界面
    //判断返回中是否有数据，如果有数据，进行鉴权状态的判断，鉴权失败跳转登录，其它的弹窗显示警告。
    if (error.response.data) {
      //获取自己定义的返回中的code
      const { code } = error.response.data;
      if (code === 401 || code === 403) {
        //表示鉴权出现了问题
        ElMessageBox.confirm("您还没有登录，请登录后再进行访问", "警告", {
          type: "warning",
        })
          .then(() => {
            //已经鉴权失败了，清理掉没有用的token
            localStorage.clear();
            window.location.href = "/#/login";
          })
          .catch(() => {
            //已经鉴权失败了，清理掉没有用的token
            localStorage.clear();
            window.location.href = "/#/login";
          });
      } else {
        ElMessage({
          //||能够判断前面的语句为false再执行后面的，所以msg如果为null或者undefined，就会执行后面的
          message:
            "请求业务失败：" +
              (error.response.data.data
                ? error.response.data.data
                : error.response.data.msg
                ? error.response.data.msg
                : error) || "系统错误",
          type: "error",
        });
      }
    }
    return Promise.reject(error);
  }
);

//默认导出
export default instance;
